﻿package com.components
{
	import flash.display.*;
	
	import com.datasource.ElementSkinVO;
	
	import com.tools.SkinLoader;
	
	import com.conf.PlayerSpec;
	
	import flash.events.MouseEvent;
	
	/////////////////////////////////////////////////////////////////////////////////////////////////////////
	// PlayerPointer ::
	// - composant type bouton à 3 états : up, over, down
	/////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	public class PlayerPointer extends Sprite
	{
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// MEMBRES DE CLASSE
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		private var _upState 				: MovieClip;
		private var _overState 				: MovieClip;
		private var _downState				: MovieClip;
		
		protected var _componentsArr		: Array = new Array( );
		
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// CONSTRUCTEUR
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		function PlayerPointer()
		{
			super();
			
			// ajout du comportement de bouton au composant
			buttonMode = true;
			mouseChildren = false;
						
			init(  );
			
			addEventListener( MouseEvent.MOUSE_UP, handleMouseActions );
			addEventListener( MouseEvent.MOUSE_OUT, handleMouseActions );
			addEventListener( MouseEvent.MOUSE_OVER, handleMouseActions );
			addEventListener( MouseEvent.MOUSE_DOWN, handleMouseActions );
		}
		
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// METHODES PROTEGEES : MECANISMES INTERNES DU COMPOSANT (à surcharger à l'héritage)
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		// initialisation du composant
		// à surcharger si l'on étend la classe et que la classe enfant a plus de 3 états
		protected function init( ) : void
		{
			upState = new MovieClip();
			overState = new MovieClip();
			downState = new MovieClip();
			
			initProps( PlayerSpec.PTR_THREE_STATES );
			
			// on déclenche manuellement le premier état au chargement du composant
			handleMouseActions( new MouseEvent( MouseEvent.MOUSE_UP ) );
		}
		
		// référencement des éléments graphiques à placer dans les propriétés du composant
		// + attribution d'un nom d'occurence et ajout à la liste d'affichage
		protected function initProps( pArr : Array ) : void
		{
			var lng : uint = pArr.length;
			
			for ( var i : uint = 0 ; i < lng ; i++ )
			{
				_componentsArr.push( this[ pArr[i] ] );
				_componentsArr[i].name = pArr[i];
				addChild( _componentsArr[i] );
			}
		}
		
		// à surcharger si l'on étend la classe et que la classe enfant a plus de 3 états
		protected function handleMouseActions( pEvt : MouseEvent ) : void
		{
			switch( pEvt.type )
			{
				case MouseEvent.MOUSE_UP:
				activeVisibilityOn( upState );
				break;
				
				case MouseEvent.MOUSE_DOWN :
				activeVisibilityOn( downState );
				break;
				
				case MouseEvent.MOUSE_OVER :
				activeVisibilityOn( overState );
				break;
				
				case MouseEvent.MOUSE_OUT :
				activeVisibilityOn( upState );
				break;
				
				default :
				activeVisibilityOn( upState );
				break;
			}
		}
		
		// méthode générique pour afficher l'élément graphique désiré et masquer les autres éléments graphiques
		protected function activeVisibilityOn ( mc : MovieClip ) : void
		{
			var lng : uint = _componentsArr.length;
			
			for ( var i : uint = 0 ; i < lng ; i++ )
			{
				if ( _componentsArr[i].name == mc.name )
				{
					_componentsArr[i].visible = true;
				}
				else
				{
					_componentsArr[i].visible = false;
				}
			}
		}
				
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// GETTER & SETTER
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public function get upState ( ) : MovieClip
		{
			return _upState;
		}
		
		public function set upState( val : MovieClip ) : void
		{
			_upState = val;
		}
		
		public function get overState ( ) : MovieClip
		{
			return _overState;
		}
		
		public function set overState( val : MovieClip ) : void
		{
			_overState = val;
		}
		
		public function get downState ( ) : MovieClip
		{
			return _downState;
		}
		
		public function set downState( val : MovieClip ) : void
		{
			_downState = val;
		}
	}
}